WEBVTT 00:00.000 --> 00:07.000 Ike. It's much easier and much easier to spell. If you'd like me to spell out the first one, 00:08.120 --> 00:11.000 I can. Anybody need it? 00:11.000 --> 00:12.520 I want it. 00:12.520 --> 00:16.600 Okay. We'll go with I-K-E. That's much easier. 00:16.600 --> 00:23.600 All right. So I am the lead project manager for Wikivorks. Let me show you. 00:23.600 --> 00:30.600 This mouse thing is not working. 00:34.240 --> 00:38.720 And there's my user page. 00:38.720 --> 00:45.720 You can pull it up. I got involved in MediaWiki around March 2006. We can skip the rest. 00:46.440 --> 00:52.960 I have written a lot of extensions. We're going on 30 now. 00:52.960 --> 00:59.640 So and V for all actually, I wrote with your own yesterday at the collab camp. We're almost 00:59.640 --> 01:02.360 there. 01:02.360 --> 01:07.600 So most of those you haven't heard of because the reason I write extensions is not because 01:07.600 --> 01:12.000 there are lots and lots of users who think they're going to be useful or that I think 01:12.000 --> 01:17.200 are useful. It's because people pay me to write them because they think they're useful. 01:17.200 --> 01:23.200 So you probably haven't used too many of mine, but I've written a whole bunch of them. I 01:23.200 --> 01:27.280 was wondering with all those numbers, what's the number of extensions that one human being 01:27.280 --> 01:30.120 can possibly maintain at the same time? 01:30.120 --> 01:34.520 I think I'm way past that. 01:34.520 --> 01:37.680 But people pay me, I still write them. 01:37.680 --> 01:44.680 So I took over as project manager for Wikivorks, which basically means that I'm running stuff 01:44.680 --> 01:51.560 since Yaron went to Genesis, so he's still involved. So I'm doing less development and 01:51.560 --> 01:55.080 more stuff that nobody really wants to do. 01:55.080 --> 02:01.400 I set up a wiki to kind of show you when we go in and there's a client who says, okay, 02:01.400 --> 02:07.920 make me a wiki. So how do we set it up? These are things I've learned over the years. It's 02:07.920 --> 02:13.680 going to be tips and tricks. You got the wiki. It's all installed. Hopefully it works. And 02:13.680 --> 02:14.920 now what? 02:14.920 --> 02:21.000 So it's I think important to set it up in a way that you can use it and maintain it 02:21.000 --> 02:28.000 and track it. Now, one pet peeve of mine, I don't like the way the media wiki structure, 02:28.000 --> 02:32.920 the file structure works at all. I don't know if this has been discussed, but you've got 02:32.920 --> 02:39.240 like, so you got your w directory. Okay. There's tip number one. Don't put media wiki in the 02:39.240 --> 02:42.880 root. Put it in a directory. We'll talk more about that maybe later. 02:42.880 --> 02:46.280 You have your w directory. It's got all your wiki files. Where's your setting files? So 02:46.280 --> 02:50.720 you'll start looking. Okay. I got API. I got this one. I got that one. Eventually you'll 02:50.720 --> 02:57.160 hit L and that's your local settings.php. Why is it there? You want extensions. Oh, 02:57.160 --> 03:01.920 it's in the extensions directory. Images. They're in the images directory. How about 03:01.920 --> 03:07.200 you have one directory for media wiki and everything in there is media wiki and nothing 03:07.200 --> 03:14.880 in there changes. You've got a sibling directory for extensions, a sibling directory for images, 03:14.880 --> 03:19.920 and you've got your local settings either in the root or in its own config directory 03:19.920 --> 03:23.400 with anything else. Do we have support for that? 03:23.400 --> 03:24.800 Yeah. Okay. 03:24.800 --> 03:29.080 I would note that those directory locations are configurable and you can actually just 03:29.080 --> 03:30.480 do that. Okay. 03:30.480 --> 03:34.960 Minus local settings.php, at the very least you have to have a small thing that could 03:34.960 --> 03:40.480 require a file from somewhere else. Otherwise you can move image directory, extensions directory. 03:40.480 --> 03:41.480 You could do all that. Right. 03:41.480 --> 03:42.480 As long as you set a config. 03:42.480 --> 03:47.640 I'll show you some of that myself. Out of the box, if you look at other platforms you'll 03:47.640 --> 03:52.960 see you've got the stuff that you don't change and the stuff that you do change. They're 03:52.960 --> 03:58.960 very separate and you don't have to move things around and set configs and stuff like that. 03:58.960 --> 04:04.360 There's one little pet peeve of mine. One of the first things I do when I set up a wiki 04:04.360 --> 04:12.360 is I move local settings. Actually what I do is I create an extension. I go into the 04:12.360 --> 04:21.800 extensions folder and I create an extension like the one that you saw. This is the EMW 04:21.800 --> 04:26.840 con extension. Let's say EMW con was the name of a company and they came to me and said 04:26.840 --> 04:34.280 make a wiki. That's what I do. I create an extension. I hit get in it. We've got to get 04:34.280 --> 04:41.160 repository. This is going to hold all of the settings and everything for the wiki. It's 04:41.160 --> 04:45.760 all in one extensions directory here. We'll go through it step by step. 04:45.760 --> 04:55.920 The first thing we do is you've got your local settings. This will look a little familiar. 04:55.920 --> 05:01.120 It's everything in the standard local settings that was generated by your installer. I take 05:01.120 --> 05:08.680 out passwords. Some people say it's not a good idea to store it in a Git repo. I put 05:08.680 --> 05:14.960 that somewhere else. Let's see if I can get it for you. 05:14.960 --> 05:21.240 In my security talk, but I also agree that storing passwords publicly is bad for security. 05:21.240 --> 05:22.240 Yeah? 05:22.240 --> 05:23.240 Yeah. 05:23.240 --> 05:24.240 Can you explain? 05:24.240 --> 05:27.240 Yeah. There's this thing called Google. 05:27.240 --> 05:38.880 Okay. Hi. I guess I was not talking to it. 05:38.880 --> 05:50.240 Okay. Let me show you the... Let's see if I can move this over. Here is your directory 05:50.240 --> 05:59.080 structure. Here's your local settings for your benefit. Local settings with fake passwords. 05:59.080 --> 06:04.960 Not that I suspect that anybody here would actually try to hack into this server while 06:04.960 --> 06:10.040 I'm talking and change things around, but actually that is exactly what I'm worried 06:10.040 --> 06:18.840 about. Here's the local settings with fake passwords. This is what it would look like. 06:18.840 --> 06:24.120 You're welcome to try and break in. They really are fake passwords. 06:24.120 --> 06:29.880 All it's got... This is an interesting little bit of code. It's a little bit outdated, but 06:29.880 --> 06:33.840 it's basically if you want to debug your wiki very quickly, you just uncomment that. You 06:33.840 --> 06:39.960 go into debug mode. Then we've got the db password, the secret key, the upgrade key, 06:39.960 --> 06:45.680 and it require... Basically it says, look for the emwcon local settings. That's where 06:45.680 --> 06:51.640 all the settings of the wiki are. That makes things nice, easy, tidy, and hopefully you 06:51.640 --> 07:06.680 never even have to look at this at all. All right. Any questions so far? Okay. Let's go 07:06.680 --> 07:16.280 back here. All right. You've set up your wiki and it's basically blank. You'll see in this 07:16.280 --> 07:22.680 one even though semantic media wiki was not included in local settings since it's installed 07:22.680 --> 07:28.120 by Composer, it's there and there's no way to turn it off short of uninstalling. All 07:28.120 --> 07:34.040 right. Cindy, you're shaking your head. Yeah. I don't like it either. The fact that... Okay. 07:34.040 --> 07:48.440 There's got to be a way to turn off vendor extensions, right? Okay. All right. Next step, 07:48.440 --> 07:55.520 go back to our repo. I actually discovered that even though it's very easy to take a 07:55.520 --> 08:03.080 Git repo and go back, there's no easy way to go forward. All right. I'd like to show 08:03.080 --> 08:06.840 you the results of each one of these. It's just going to take me a little bit of time 08:06.840 --> 08:10.000 to set everything up here because I'm going to have to manually check out each one of 08:10.000 --> 08:15.640 these commits. All right. Second commit, we add a configuration blank shell. This actually 08:15.640 --> 08:34.880 doesn't do anything. Okay. There's a few things here. First, just keep things simple, separate 08:34.880 --> 08:39.480 them into sections. I like these sections. I have my core configuration in one spot, 08:39.480 --> 08:44.120 extension inclusion in another spot, and I like my extension configuration later. Some 08:44.120 --> 08:47.200 people like the inclusion with the configuration. I really don't like it. It makes everything 08:47.200 --> 08:55.360 very messy. Here you'll see a very interesting extension inclusion thingy where I don't want 08:55.360 --> 09:00.840 to have to worry about if this extension writer decided to make an extension.json or is still 09:00.840 --> 09:07.800 using the old way. There's a slight performance hit, but I stick everything in one array and 09:07.800 --> 09:12.960 I do a little for each. I go through each one. If there's a JSON file, use it. If there's 09:12.960 --> 09:25.040 no JSON file, just use the old way. All right. It's a little nifty little piece of code. 09:25.040 --> 09:30.240 Install semantic media wiki even though you already saw it installed, but this is the 09:30.240 --> 09:41.360 way it would look for installing semantic media wiki. Now, I added composer.local.json. 09:41.360 --> 09:48.040 What is that? If you look at pretty much any extension on media wiki.org, it will tell 09:48.040 --> 09:54.760 you how to install an extension using composer. I don't want to pick on Elastica. It's just 09:54.760 --> 09:59.800 an example. You can find it on pretty much any extension on media wiki.org. In fact, 09:59.800 --> 10:05.400 the official extension install template will tell you to do this. If you want to install 10:05.400 --> 10:15.560 with composer, run composer install. What will that do? It's going to put everything 10:15.560 --> 10:23.200 into your standard composer.json. What happens when you upgrade? Your composer.json has been 10:23.200 --> 10:30.920 overwritten. That's why the very wise people who made the media wiki core, they put in 10:30.920 --> 10:38.120 a merge plugin. You can have a composer.local.json which doesn't get overwritten and will automatically 10:38.120 --> 10:54.640 be included. What I do is I take that composer.local and you probably guessed it. I do nothing 10:54.640 --> 11:02.160 other than use the merge plugin to merge another composer.local.json which is in our git repo. 11:02.160 --> 11:14.640 Again, everything is in one place, nice and easy. There it is. Instead of doing it from 11:14.640 --> 11:18.760 the command line which is going to put it into your composer.json, you put it into your 11:18.760 --> 11:26.920 composer.local.json and you can track it and it won't get overwritten. Have I lost anybody? 11:26.920 --> 11:33.400 Any questions? Anybody too afraid to speak up? 11:33.400 --> 11:49.040 I would only point out that on the last set it says composer install but it does not say 11:49.040 --> 11:56.360 install media wiki extension. It assumes that you have already updated composer somehow. 11:56.360 --> 11:57.360 Your composer.json. 11:57.360 --> 11:58.360 I'm a little confused. 11:58.360 --> 12:00.360 You said it messes up your… 12:00.360 --> 12:06.160 It's not going to overwrite it. It's going to stick this into composer.json. 12:06.160 --> 12:07.160 No, there's… 12:07.160 --> 12:14.320 I'm sorry, you're right. It's the wrong extension. If you look at another one. The 12:14.320 --> 12:22.080 standard extension install is going to stick it into composer.json on the bottom. 12:22.080 --> 12:25.280 What happens when you overwrite, when you upgrade media wiki? 12:25.280 --> 12:32.280 I'm just pointing out. I was confused by that because you said it overwrites it and 12:32.280 --> 12:33.280 that doesn't… 12:33.280 --> 12:37.400 No, this doesn't overwrite it. I'm sorry. Let's do that again. When you do composer 12:37.400 --> 12:45.520 install what it's going to do is it's going to take this… I'm doing the wrong extension 12:45.520 --> 12:48.280 here. Let's say you're doing… 12:48.280 --> 12:55.280 It's going to get into the composer.json. 12:55.280 --> 12:56.280 Right. 12:56.280 --> 12:57.280 Which has to check out from… 12:57.280 --> 13:01.120 Right. Exactly. Exactly. Let's say you were on… Semantic Media Wiki actually has 13:01.120 --> 13:02.120 a note about this. 13:02.120 --> 13:28.440 I don't want to mess up the composer.json. Right. Let's see. Here's what you do. If 13:28.440 --> 13:36.160 you do this, then it's going to stick this on the bottom of your composer.json with the 13:36.160 --> 13:37.160 version. Right? 13:37.160 --> 13:38.160 Right. 13:38.160 --> 13:43.480 Which is great for now. When you upgrade Media Wiki, then it's going to overwrite your 13:43.480 --> 13:50.080 composer.json. Right? From now on when you want to update Semantic Media Wiki, it's 13:50.080 --> 13:54.080 not going to pick up that it's there or which version you want or anything because 13:54.080 --> 13:59.800 it's gone. That's why they have this little note here. 13:59.800 --> 14:11.480 All right. Let's go back to this. Install parser functions. Very simple. If you want 14:11.480 --> 14:21.200 to add an extension, you just put it in your extension array. Done. Google Analytics. Same 14:21.200 --> 14:34.880 idea but with configuration. That's fake. You want to add your logo. Another tip. A 14:34.880 --> 14:42.160 lot of people will take this and overwrite resource assets, wiki.png, with their own 14:42.160 --> 14:52.080 logo. Great idea until you update. Then it's gone. Instead you put it where? In this exact 14:52.080 --> 15:13.640 extension. Then it's there. It doesn't go anywhere. Let's actually check this out. All 15:13.640 --> 15:39.800 right. No security breach here, right? All right. Let's do that again. Okay. We're logged 15:39.800 --> 15:48.240 in as root. Let's change that. Okay. Now we'll check out this commit. Let's see what this 15:48.240 --> 15:57.720 looks like. Somebody could commit something to get itself. That allows you to go forward. 15:57.720 --> 16:14.000 One commit. That would be nice. Okay. This is where the extension is. Okay. We've added 16:14.000 --> 16:29.760 our logo. Instead of this vanilla version page. Ta-da. Okay. Now we actually put it 16:29.760 --> 16:36.840 into an actual extension. We put a blank extension.json. I don't usually do it in a gazillion steps 16:36.840 --> 16:43.920 like this. Just for demonstration purposes, this is a blank extension.json. It's customizations 16:43.920 --> 16:48.880 for the emwcon wiki. It would make my life a lot easier if I called this extension my 16:48.880 --> 16:54.120 wiki or something like that and just used the same one for everybody. But companies 16:54.120 --> 16:58.840 usually like to see their names and lights on the special version page. So we called 16:58.840 --> 17:09.600 it emwcon. You include it in your extension array. Now we can use it for stuff. So a common 17:09.600 --> 17:14.920 thing, you want to add custom CSS. You don't want to stick it into the actual wiki. There 17:14.920 --> 17:20.480 may be a number of reasons you don't want to do that. So we put it into our little extension 17:20.480 --> 17:26.000 here. Instead of trying to stick a hook or something into the local settings, we just 17:26.000 --> 17:32.680 do it the real way. Add it to the resource loader. And there's actually nothing in this 17:32.680 --> 17:45.100 file yet. Empty file added on bottom. But it's there. And you'll notice that the directory 17:45.100 --> 17:49.760 structure of this extension, I usually follow the same structure as media wiki. So same 17:49.760 --> 17:56.720 way media wiki has a skins folder, this extension also has a skins folder. And instead of having 17:56.720 --> 18:01.160 like one global CSS file, I understand that a lot of this CSS is only going to be relevant 18:01.160 --> 18:07.840 to the vector skin. So we put it in the vector directory. And then we'll actually use it 18:07.840 --> 18:19.720 to change the background. So here the background color has been changed to something nice and 18:19.720 --> 18:38.160 nifty. We'll check it out. Nice and nifty. All right. Convert it to a wiki farm. Everybody's 18:38.160 --> 18:45.120 been talking about wiki farms. The way we do wiki farms is what's been referenced with 18:45.120 --> 18:55.040 symlinks. So if you look on media wiki.org, essentially this is what we do. We've had 18:55.040 --> 19:00.280 a lot of success with it. It's really, really easy if you're an advanced user. It's just 19:00.280 --> 19:08.320 very quick. This is not something for everybody. But if you're familiar with this, you basically 19:08.320 --> 19:17.480 just set up like symlinks. This is a symlink and very important, that symlink does not 19:17.480 --> 19:24.320 point to this w directory. It has its own w directory, which is a symlink. Why is that 19:24.320 --> 19:30.080 important? Because you want to be able to store something for each wiki that might be 19:30.080 --> 19:33.320 relevant for that wiki. The same way you don't have a wiki in the wiki root, you don't want 19:33.320 --> 19:37.960 individual wikis on your wiki farm in the root directory either. You need a robots.txt 19:37.960 --> 19:42.200 for each particular wiki. You need maybe Google site verification. All kinds of interesting 19:42.200 --> 19:48.800 things that might be specific to each wiki. So again, basically in your directory, in 19:48.800 --> 19:54.040 your root directory, you have a symlink to each little wiki. So this is going to be the 19:54.040 --> 19:59.120 main wiki. It's already there. This is going to be a QA wiki, which I'll talk about in 19:59.120 --> 20:07.520 a minute. So I wrote a little extension that's not for public consumption because it's not 20:07.520 --> 20:14.000 very good. But it's essentially this, just with a few extra functions, a little bit of 20:14.000 --> 20:25.560 extra functionality. So when we load our wiki farm, it looks like this. Convert to wiki 20:25.560 --> 20:33.720 farm. It's the same thing, but with a slightly different URL. So we take out all the path 20:33.720 --> 20:42.440 stuff and we put it into this directory here, sites. So this is again, all in the same extension. 20:42.440 --> 20:49.440 This is a sites directory, which has individual settings for each wiki on the farm. So this 20:49.440 --> 20:56.560 is going to be the EMW con wiki. Those are settings for that specific one. I have global 20:56.560 --> 21:02.720 configuration overrides and I am going to include this minimalist farm extension. That's 21:02.720 --> 21:08.400 that extension that I was speaking about before, which basically does that ultimate minimalist 21:08.400 --> 21:17.320 solution. And we tell it here, the name of the wiki. So because it says look for EMW 21:17.320 --> 21:25.840 con.com, it knows to follow that and look in sites for slash EMW con.com slash PHP. 21:25.840 --> 21:33.600 So that's it. Basically just put in the name of the file and include the extension. We've 21:33.600 --> 21:40.000 got ourselves a farm. Of course we have to change, for this example we have to change 21:40.000 --> 21:43.920 the script path. Usually the script path is going to change slash w, right, because the 21:43.920 --> 21:48.600 symlink has a slash w inside. We're not using our own domain name, so it changed a little 21:48.600 --> 21:53.200 bit. But pretty much everything else stays the same and you've got yourself a farm. How 21:53.200 --> 21:59.360 long does that take? Not very long. Now you may be thinking I'm setting up a single wiki, 21:59.360 --> 22:05.160 why do I need a farm? So you saw the answer already. QA site. Now ideally you've got a 22:05.160 --> 22:09.480 whole different QA server with a whole very fancy system for keeping them in sync and 22:09.480 --> 22:15.120 everything is beautiful. But most of us don't live in an ideal world and we don't have a 22:15.120 --> 22:19.600 QA server either because we don't need it, we don't have the budget for it, or we're 22:19.600 --> 22:24.760 too lazy. So this addresses at least the too lazy part. It's not going to give you a bigger 22:24.760 --> 22:31.080 budget but if you're too lazy to set up a different one, this takes 30 seconds, right, 22:31.080 --> 22:38.280 because all you have to do now to set up the QA site is this commit right here, add QA 22:38.280 --> 22:49.280 site, which is not very complex. All right, that's it. And now you can test out all your 22:49.280 --> 22:53.480 settings, whatever you wanted to change on your local settings. We've all changed things 22:53.480 --> 22:59.600 that crashed the wiki. It's not a good idea. Do it on the QA first and then move it over. 22:59.600 --> 23:03.120 There's all kinds of fancy stuff you could do with Git with the QA site and the main 23:03.120 --> 23:10.640 site. I kept things very linear for the presentation. Okay, any questions on this so far? I know 23:10.640 --> 23:18.640 it's a lot of stuff to take in. All right. Now you can have first site customization. 23:18.640 --> 23:24.160 And you can kind of just detect which site we're on here. So this is the EMWCon site 23:24.160 --> 23:30.120 variable. So we're going to set this in each individual site's settings. This is the QA 23:30.120 --> 23:35.320 site's settings. So we're adding this global here. We're sending it to QA. The main site 23:35.320 --> 23:41.840 setting, we're sending it to production. What does that allow us to do? This is just in 23:41.840 --> 23:52.040 the config where we added the variable. And now, different styles. So we have a totally 23:52.040 --> 23:58.800 separate file. This is, of course, you can do whatever you want. You can have the production 23:58.800 --> 24:05.160 site CSS plus this CSS load. The way I did it here, this QA site, I want everybody to 24:05.160 --> 24:09.480 know they're on the QA site when they're making their changes. So I changed the background 24:09.480 --> 24:19.480 color to a very nifty, very red color. And it's going to load its own QA CSS file, which 24:19.480 --> 24:27.800 is on the bottom. This is how we decide which file needs to be loaded. All right. In the 24:27.800 --> 24:33.120 hooks, we say, well, if we're on production, then add that module. If we're in QA, then 24:33.120 --> 24:47.160 add the QA module. Let's actually check this out. 24:47.160 --> 25:15.280 Let's do that again. All right. So since we made this into a farm, so our main site is 25:15.280 --> 25:44.920 actually here. And the QA site is not working. There we go. 25:44.920 --> 25:49.880 So, as you can see, you got a different background color, very clear to you when you're on QA 25:49.880 --> 26:00.920 and when you're on production, you'll want to keep that straight. Okay. All right. And 26:00.920 --> 26:09.600 that's pretty much it. Here I got lazy. Had a few extensions. Add visual editor, add page 26:09.600 --> 26:15.520 forms, add V for all. So V for all, I'll just talk for a minute about it. We're trying to 26:15.520 --> 26:21.560 get visual editor more easily added by different extensions, particularly common streams and 26:21.560 --> 26:26.960 page forms. Instead of customizing it for each one like Flow did, just kind of make 26:26.960 --> 26:35.720 an adapter extension that is going to service the middle to connect the new extension with 26:35.720 --> 26:39.560 visual editor. And hopefully the new extension is just going to have to add a line or two 26:39.560 --> 26:46.480 and a visual editor will be enabled. So we're working on that. I think that's pretty much 26:46.480 --> 26:47.480 it. Any questions? Okay. Aaron. 26:47.480 --> 27:02.960 How often do you do a git check in of changes that you made? 27:02.960 --> 27:11.080 Okay. Yes. So the answer is allegedly every time, every single change, it goes immediately 27:11.080 --> 27:17.800 into the git repo. Practically sometimes it looks like that at a few extensions, but really 27:17.800 --> 27:22.680 everything should go in there. And especially for consultants, this is actually very important 27:22.680 --> 27:29.360 to be tracking settings with a git repo because your client calls up, you know, we've all 27:29.360 --> 27:41.160 had this. It's not working. You know, what's not working? It. All right. How do you figure 27:41.160 --> 27:46.640 out what went wrong? So if you have a git repo there, then you'll see immediately either 27:46.640 --> 27:50.520 they made a change and committed it to git and you see immediately what the change was 27:50.520 --> 27:55.040 and who committed it. Or more likely they made a change and didn't commit it to git, 27:55.040 --> 28:00.480 in which case you do a git diff and you see what went wrong and you just roll it back. 28:00.480 --> 28:07.560 So very important, really in all settings. You're in a corporate environment, anything. 28:07.560 --> 28:12.160 You have to be able to track your settings on your Wiki. So that's the way to do it. 28:12.160 --> 28:22.360 Yes. Why don't you make this into a pitch or like 28:22.360 --> 28:30.760 this extension or? It's an idea to, yeah. The answer is because it's really easy and 28:30.760 --> 28:41.240 fast for me. Lots and lots of times. It's an idea, you know, in the right time. Part 28:41.240 --> 28:46.280 of the reason it's harder, like I said, I like to customize the name of it for everybody. 28:46.280 --> 28:53.200 Although that could also be made easy. Anybody ever use, when you're developing extensions, 28:53.200 --> 28:58.800 anyone use the cookie cutter template? I didn't put it on. There's a really cool cookie cutter 28:58.800 --> 29:03.000 template where you can insert the name of the extension and it just, whoo, it just puts 29:03.000 --> 29:09.800 all the stuff in with all the internationalization prefixes into the internationalization directory 29:09.800 --> 29:14.200 and it gives you a hooks file, it gives you a parser function, it gives you a sample special 29:14.200 --> 29:19.880 page. It's like boilerplate, but you don't have to go into boilerplate afterwards and 29:19.880 --> 29:27.560 change everything. That's really good. Okay. I'm at 30 minutes and six seconds. Let the 29:27.560 --> 29:44.600 record show. All right. Thank you very much everybody.